{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import statsmodels.stats.weightstats as sw"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "'''\n",
    "https://wiki.mbalib.com/wiki/Z%E6%A3%80%E9%AA%8C\n",
    "Z检验法适用于大样本（样本容量大于30）的两平均数之间差异显著性检验的方法。它是通过计算两个平均数之间差的Z分数来与规定的理论Z值相比较，\n",
    "看是否大于规定的理论Z值，从而判定两平均数的差异是否显著的一种差异显著性检验方法\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "'''\n",
    "对于大样本数据（样本量 ≥ 30），或者即使是小样本，但是知道其服从正态分布，\n",
    "并且知道总体分布的方差时，需要用 z 检验。在 python 中，由于 scipy 包没有 z 检验，\n",
    "只能用 statsmodels 包中的 ztest 函数。ztest 函数的一般用法如下：\n",
    "输入参数：\n",
    "x1\t数组，第一个样本的数据值\n",
    "x2\t数组，第二个样本的数据值，默认没有值\n",
    "value\t浮点型数值，若是单样本，则 value 是样本假设的均值\n",
    "若是双样本，则 value是两个样本均值的差值\n",
    "alternative\t若为 `larger’，备选假设 H1 大于 value 值\n",
    "若为 `smaller’，备选假设 H1 小于 value 值\n",
    "输出参数：\n",
    "tstats\t统计量值\n",
    "pvalue\tp 值\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.3859224924939799, 0.6995540720244979)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 包含了36个数据的样本\n",
    "arr=[23,36,42,34,39,34,35,42,53,28,49,39,\n",
    "    46,45,39,38,45,27,43,54,36,34,48,36,\n",
    "    47,44,48,45,44,33,24,40,50,32,39,31]\n",
    "# 样本个数大于 30，使用 z 检验，检测其均值是否为 39\n",
    "sw.ztest(arr, value=39)\n",
    "# 从 ztest 的运行结果可以看出，统计量值为 0.385，而 p 值是 0.699，在置信度 α = 0.05 时\n",
    "# 由于 p 值大于 α ，接受原假设，认为该样本的均值是 39。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.3859224924939799, 0.650222963987751)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 若要检测该样本均值是否大于 39，即原假设 H0：μ ≥ 39 \n",
    "# μ≥39，备选假设为：μ < 39，则我们需要在代码中增加一个参数 alternative=``smaller”\n",
    "sw.ztest(arr, value=39, alternative=\"smaller\")\n",
    "# 检测结果的 p 值为 0.650，大于置信度 0.05，则接受原假设，认为样本均值大于39"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3.775645601380307, 0.0001595937672736755)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 定义另外一个样本 2 的数据\n",
    "arr2 = [41, 34, 36, 32, 32, 35, 33, 31, 35, 34,\n",
    "    37, 34, 31, 36, 37, 34, 33, 37, 33, 38,\n",
    "    38, 37, 34, 36, 36, 31, 33, 36, 37, 35,\n",
    "    33, 34, 33, 35, 34, 34, 34, 35, 35, 34]\n",
    "# 检测两个样本的均值是否相等，因为两个样本都是大样本，使用 z 检验\n",
    "sw.ztest(arr, arr2, value=0)\n",
    "# 从 ztest 的检验结果可以看出，p 值小于 0.05， 则拒绝原假设，认为两个样本的均值不相等。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
